package com.plugin.manage.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.plugin.core.model.entity.ElderCheckIn;
import com.plugin.manage.mapper.CheckinMapper;
import com.plugin.manage.pojo.vo.ElderCheckinDetailVO;
import com.plugin.manage.service.ICheckinService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 入住记录服务实现类
 *
 * @author mark
 * @date 2025-07-31
 */
@Service
@Slf4j
public class CheckinServiceImpl extends ServiceImpl<CheckinMapper, ElderCheckIn> implements ICheckinService {

    @Autowired
    private CheckinMapper checkinMapper;

    /**
     * 获取今日入住人数
     * 统计elder_check_in表中status=4（已缴费入住）的记录数
     * 
     * @param startTime 开始时间（今日00:00:00）
     * @param endTime 结束时间（今日23:59:59）
     * @return 今日入住人数
     */
    @Override
    public Long getTodayCheckedInCount(LocalDateTime startTime, LocalDateTime endTime) {
        log.info("获取今日入住人数，时间范围：{} - {}", startTime, endTime);
        return checkinMapper.countTodayCheckedIn(startTime, endTime);
    }

    /**
     * 获取待审核的入住记录数量（status=1）
     * 
     * @return 待审核的入住记录数量
     */
    @Override
    public Long getPendingReviewCount() {
        log.info("获取待审核的入住记录数量");
        return checkinMapper.countPendingReviewCheckins();
    }
    
    /**
     * 获取总的已入住人数
     * 
     * @return 总的已入住人数
     */
    @Override
    public Long getTotalCheckedInCount() {
        log.info("获取总的已入住人数");
        return checkinMapper.countTotalCheckedIn();
    }
    
    /**
     * 获取未离开且指定状态的记录数
     * 
     * @param status 状态值(1-5)，如果为null则查询所有状态
     * @return 符合条件的记录数
     */
    @Override
    public Map<String, Long> getCountByStatus(Integer status) {
        log.info("获取未离开且状态为{}的记录数", status != null ? status : "1-5");
        Map<String, Long> resultMap = new HashMap<>();
        
        // 如果指定了状态，只查询该状态的记录数
        if (status != null && status >= 1 && status <= 5) {
            Long count = checkinMapper.countByStatusAndNotLeave(status);
            resultMap.put("status", count);
            resultMap.put("total", count);
            return resultMap;
        }
        
        return resultMap;
    }

    /**
     * 关联查询长者信息和入住状态，按时间倒序排列
     *
     * @return 长者状态信息列表
     */
    @Override
    public List<Map<String, Object>> getElderStatusList() {
        log.info("开始查询长者信息和入住状态列表");
        List<Map<String, Object>> elderStatusList = checkinMapper.getElderStatusList();
        for(Map<String, Object> map : elderStatusList){
            map.put("nextStatus", (int)map.get("status") + 1);
        }

        log.info("查询到{}条长者状态记录", elderStatusList.size());
        return elderStatusList;
    }
    
    /**
     * 更新入住记录状态
     *
     * @param id 入住记录ID
     * @param status 新状态值
     * @return 是否更新成功
     */
    @Override
    public boolean updateCheckinStatus(Long id, Integer status) {
        log.info("开始更新入住记录状态，ID：{}，新状态：{}", id, status);
        
        // 参数校验
        if (id == null || status == null || status < 1 || status > 5) {
            log.error("参数错误，ID：{}，状态：{}", id, status);
            return false;
        }
        
        try {
            // 获取当前记录
            ElderCheckIn checkin = this.getById(id);
            if (checkin == null) {
                log.error("入住记录不存在，ID：{}", id);
                return false;
            }
            
            // 更新状态
            checkin.setStatus(status);

            // 保存更新
            boolean result = this.updateById(checkin);
            log.info("更新入住记录状态{}，ID：{}，新状态：{}", result ? "成功" : "失败", id, status);
            return result;
        } catch (Exception e) {
            log.error("更新入住记录状态异常，ID：{}，新状态：{}", id, status, e);
            return false;
        }
    }
    
    /**
     * 获取长者入住详情列表
     *
     * @return 长者入住详情列表
     */
    @Override
    public List<ElderCheckinDetailVO> getElderCheckinDetailList() {
        log.info("开始查询长者入住详情列表");
        List<ElderCheckinDetailVO> detailList = checkinMapper.getElderCheckinDetailList();
        log.info("查询到{}条长者入住详情记录", detailList.size());
        return detailList;
    }
}
